#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:taotieren


"""
    rpi.gpio 需要 root 权限，板上运行需要使用
    sudo python adc_scaled.py
    ADC(模数转换器)分压器
        MCP3008 八通道 ADC IC， 10KΩ 电阻，3.3KΩ 电阻，9V 电池和夹线
        安装是芯片缺口朝上

    Power1 ------
                |
                R1
                |
     Vin        -------- Power2
                |
                R2      Vout
                |
     Power1 ------------- Power2
     分压器
     Vout = Vin * R2 / (R1 + R2)
     I = Vin /（R1 + R2）
     9V / 13.3 KΩ = 0.68 mA

     虽然电流很小，但是仍足以耗尽电池的电量，不用时断开。

        实验前，确保开启 SPI，并且安装好了 Python 的 SPI 库 （pip install spidev）

    MCP3008 是 10 比特 的 ADC，每次读取的时候会返回一个介于 0 到 1023 之间的数字
        测试程序将会把它转化为电压值，方法是将读取的数值乘以电压范围（3.3V）然后除以 1024.


"""

""" 非树莓派环境下可以用 rpi.gpio_def 代替 rpi.gpio 来进行程序调试和验证 """
import spidev

R1 = 10000.0
R2 = 3300.0

spi = spidev.SpiDev()
spi.open(0, 0)


def analog_read(channel):
    r = spi.xfer2([1, (8 + channel) << 4, 0])
    adc_out = ((r[1] & 3) << 8) + r[2]
    return adc_out


reading = analog_read(0)
voltage_adc = reading * 3.3 / 1024
voltage_actual = voltage_adc / (R2 / (R1 + R2))
print("Battery Voltage =" + str(voltage_actual))
